import { v4 as uuidv4 } from 'uuid';

/**
 * 延迟执行
 * @param ms 毫秒数（默认 1）
 * @returns Promise，await 后继续执行
 *
 * @example
 * await delay(1000); // 暂停 1 秒
 */
export const delay = (ms = 1): Promise<void> =>
  new Promise(resolve => setTimeout(resolve, ms));

/**
 * 生成 UUID v4
 * @example uuid() → "123e4567-e89b-12d3-a456-426614174000"
 */
export const uuid = (): string => uuidv4();

/** 当前时间戳（毫秒） */
export const now = (): number => Date.now();

interface FormatTimeOptions {
  format?: 'year' | 'month' | 'date' | 'datetime' | 'second';
  separator?: string;
  timestamp?: number;
}
interface FormatTimeOptions {
  format?: 'year' | 'month' | 'date' | 'datetime' | 'second';
  separator?: string;
  timestamp?: number;
}

/**
 * 格式化时间
 * @param options 配置项
 * @param options.format 格式（默认 'second'）
 * @param options.separator 分隔符（默认 '-'）
 * @param options.timestamp 时间戳（默认当前时间）
 * @returns 格式化后的字符串
 *
 * @example
 * formatTime() → "2025-10-29 15:30:45"
 * formatTime({ format: 'date', separator: '/' }) → "2025/10/29"
 */
export const formatTime = (
  options: FormatTimeOptions = {}
): string => {
  const {
    format = 'second',
    separator = '-',
    timestamp = Date.now(),
  } = options;

  const d = new Date(timestamp);
  const pad = (n: number) => n.toString().padStart(2, '0');

  const year = d.getFullYear();
  const month = pad(d.getMonth() + 1);
  const date = pad(d.getDate());
  const hours = pad(d.getHours());
  const minutes = pad(d.getMinutes());
  const seconds = pad(d.getSeconds());

  switch (format) {
    case 'year': return `${year}`;
    case 'month': return `${year}${separator}${month}`;
    case 'date': return `${year}${separator}${month}${separator}${date}`;
    case 'datetime': return `${year}${separator}${month}${separator}${date} ${hours}:${minutes}`;
    case 'second': return `${year}${separator}${month}${separator}${date} ${hours}:${minutes}:${seconds}`;
  }
};

/**
 * 按语言格式化时间（默认中文）
 * @param locale 语言代码，如 'zh-CN'（中文）, 'en-US'（英文）, 'ko-KR'（韩文）
 * @param timestamp 时间戳（毫秒），默认当前时间
 * @returns 格式化后的本地化时间字符串
 *
 * @example
 * formatLocaleTime('zh-CN') → "2025年10月29日 15:30:45"
 * formatLocaleTime('en-US') → "10/29/2025, 03:30:45 PM"
 */
export const formatLocaleTime = (
  locale: string = 'zh-CN',
  timestamp = Date.now()
): string => {
  return new Intl.DateTimeFormat(locale, {
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit',
    hour12: false,
  }).format(timestamp);
};